--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
meshchatx/src/backend/ringtone_manager.py 4a6ab031061b3a84f9e8e59ad5d45b70d5dcdb28 (4a6ab031) Text, 1.78 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787subprocess
Tff7b72import T7ee787RNS
Tff7b72class T56d364RingtoneManagerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3configTb4b4b4, Te6edf3storage_dirTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3config
Tff7b72selfTff7b72.Td2a8ffstorage_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3storage_dirTb4b4b4, Ta5d6ff"Ta5d6ffringtonesTa5d6ff"Tb4b4b4)
T8b949e# Ensure directory exists
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
T8b949e# Paths to executables
Tff7b72selfTff7b72.Td2a8ffffmpeg_path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_find_ffmpegTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhas_ffmpeg Tff7b72= Tff7b72selfTff7b72.Td2a8ffffmpeg_path Tff7b72is Tff7b72not Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhas_ffmpegTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRingtone: Found ffmpeg at Tffd700{Tff7b72selfTff7b72.Td2a8ffffmpeg_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRingtone: ffmpeg not foundTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ff_find_ffmpegTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3path Tff7b72= Te6edf3shutilTff7b72.Td2a8ffwhichTb4b4b4(Ta5d6ff"Ta5d6ffffmpegTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3pathTb4b4b4:
Tff7b72return Te6edf3path
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffconvert_to_ringtoneTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3input_pathTb4b4b4, Te6edf3ringtone_idTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffhas_ffmpegTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffffmpeg is required for audio conversionTa5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72import T7ee787secrets
Te6edf3filename Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffringtone_Tffd700{Te6edf3secretsTff7b72.Td2a8fftoken_hexTb4b4b4(T79c0ff8Tb4b4b4)Tffd700}Ta5d6ff.opusTa5d6ff"
Te6edf3opus_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Te6edf3filenameTb4b4b4)
Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(
Tb4b4b4[
Tff7b72selfTff7b72.Td2a8ffffmpeg_pathTb4b4b4,
Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4,
Te6edf3input_pathTb4b4b4,
Ta5d6ff"Ta5d6ff-c:aTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflibopusTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-b:aTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff32kTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-vbrTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffonTa5d6ff"Tb4b4b4,
Te6edf3opus_pathTb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3checkTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3filename
Tff7b72def Td2a8ffremove_ringtoneTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3filenameTb4b4b4)Tb4b4b4:
Te6edf3opus_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Te6edf3filenameTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3opus_pathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3opus_pathTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffget_ringtone_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3filenameTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Te6edf3filenameTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────